package org.microframework.cloud.gateway.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 访问控制配置属性
 * 用于加载黑白名单配置
 */
@Data
@Component
@RefreshScope
@ConfigurationProperties(prefix = "spring.cloud.gateway.security.access-control")
public class AccessControlProperties {

    /**
     * 是否启用访问控制
     */
    private boolean enabled = true;

    /**
     * 配置文件的Nacos DataId
     */
    private String nacosDataId = "micro-cloud-gateway-access-control.json";

    /**
     * 刷新间隔（秒）
     */
    private int refreshInterval = 30;

    /**
     * IP白名单配置
     */
    private IpWhitelist ipWhitelist = new IpWhitelist();

    /**
     * IP黑名单配置
     */
    private IpBlacklist ipBlacklist = new IpBlacklist();

    /**
     * 路径白名单配置
     */
    private PathWhitelist pathWhitelist = new PathWhitelist();

    /**
     * 路径黑名单配置
     */
    private PathBlacklist pathBlacklist = new PathBlacklist();

    /**
     * 安全配置
     */
    private SecurityConfig securityConfig = new SecurityConfig();

    /**
     * IP白名单配置
     */
    @Data
    public static class IpWhitelist {
        /**
         * 是否启用IP白名单
         */
        private boolean enabled = true;

        /**
         * IP白名单列表
         */
        private List<String> ips = new ArrayList<>();

        /**
         * 是否忽略本地地址（127.0.0.1和0:0:0:0:0:0:0:1）
         */
        private boolean ignoreLocalhost = true;

        /**
         * 白名单IP是否跳过认证
         */
        private boolean bypassAuth = true;
    }

    /**
     * IP黑名单配置
     */
    @Data
    public static class IpBlacklist {
        /**
         * 是否启用IP黑名单
         */
        private boolean enabled = true;

        /**
         * IP黑名单列表
         */
        private List<String> ips = new ArrayList<>();

        /**
         * 黑名单IP访问时返回的错误消息
         */
        private String message = "IP访问受限，请联系管理员";
    }

    /**
     * 路径白名单配置
     */
    @Data
    public static class PathWhitelist {
        /**
         * 是否启用路径白名单
         */
        private boolean enabled = true;

        /**
         * 路径白名单列表
         */
        private List<String> paths = new ArrayList<>();

        /**
         * 白名单路径是否跳过认证
         */
        private boolean bypassAuth = true;

        /**
         * 白名单路径是否跳过限流
         */
        private boolean bypassRateLimit = false;
    }

    /**
     * 路径黑名单配置
     */
    @Data
    public static class PathBlacklist {
        /**
         * 是否启用路径黑名单
         */
        private boolean enabled = true;

        /**
         * 路径黑名单列表
         */
        private List<String> paths = new ArrayList<>();

        /**
         * 黑名单路径访问时返回的错误消息
         */
        private String message = "该路径禁止访问";
    }

    /**
     * 安全配置
     */
    @Data
    public static class SecurityConfig {
        /**
         * 是否记录访问控制日志
         */
        private boolean logEnabled = true;

        /**
         * 日志级别：INFO、WARN、ERROR
         */
        private String logLevel = "WARN";

        /**
         * 阻止请求时的响应配置
         */
        private BlockResponse blockResponse = new BlockResponse();

        /**
         * 阻止请求响应配置
         */
        @Data
        public static class BlockResponse {
            /**
             * 响应状态码
             */
            private int code = 403;

            /**
             * HTTP状态码
             */
            private int status = 403;

            /**
             * 错误消息
             */
            private String message = "访问受限";

            /**
             * 是否显示详细信息
             */
            private boolean showDetail = false;
        }
    }
} 